<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>flattened(扁平)数据类型 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'flattened.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/flattened.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/flattened.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/flattened.html" rel="nofollow" target="_blank">../en/flattened.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="mapping.html">映射</a></span>
»
<span class="breadcrumb-link"><a href="mapping-types.html">字段数据类型</a></span>
»
<span class="breadcrumb-node">flattened(扁平)数据类型</span>
</div>
<div class="navheader">
<span class="prev">
<a href="histogram.html">« histogram(直方图)数据类型</a>
</span>
<span class="next">
<a href="geo-point.html">geo_point(地理坐标点)数据类型 »</a>
</span>
</div>
<div class="section xpack">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="flattened"></a>flattened(扁平)数据类型
</h2>
</div></div></div>

<p>
默认情况下，对象中的每个子字段都被单独映射和索引。

如果事先不知道子字段的名称或类型，则它们会被<a class="xref" href="dynamic-mapping.html" title="动态映射" rel="nofollow">动态映射</a>。
</p>
<p>
<code class="literal">flattened</code>类型提供了另一种方法，将整个对象映射为单个字段。

给定一个对象，<code class="literal">flattened</code>映射将解析出它的叶子值<span class="remark">(leave value)</span>，并将它们作为关键字索引到一个字段中。

然后，可以通过简单的查询和聚合来搜索对象的内容。
</p>
<p>
这种数据类型对于索引具有大量或未知数量的唯一键的对象非常有用。

对于整个JSON对象，只创建一个字段映射，这有助于防止<a class="xref" href="mapping.html#mapping-limit-settings" title="防止映射爆炸的设置">映射爆炸</a>，因为有太多不同的字段映射。
</p>
<p>
另一方面，扁平化的对象字段在搜索功能方面有所取舍。

只允许基本查询，不支持数值范围查询或高亮。

有关限制的更多信息，请参见<a class="xref" href="flattened.html#supported-operations" title="支持的操作">支持的操作</a>部分。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
<code class="literal">flattened</code>映射类型<span class="strong strong"><strong>不</strong></span>应用于索引所有文档内容，因为它将所有值视为<span class="literal">keyword</span>类型，并且不提供全文搜索功能。

默认的方法是每个子字段在映射中都有自己的入口，这种方法在大多数情况下都能很好地工作。
</p>
</div>
</div>
<p>可以按如下方式创建一个 flattened 对象字段：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT bug_reports
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "labels": {
        "type": "flattened"
      }
    }
  }
}

POST bug_reports/_doc/1
{
  "title": "Results are not sorted correctly.",
  "labels": {
    "priority": "urgent",
    "release": ["v1.2.5", "v1.3.0"],
    "timestamp": {
      "created": 1541458026,
      "closed": 1541457010
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/629.console"></div>
<p>
在编制索引的过程中，会为 JSON 对象中的每个叶子值创建 词元(token)。

这些值作为字符串值形式的 keyword 进行索引，不需要对数字或日期进行分析或特殊处理。
</p>
<p>查询<code class="literal">flattened</code>字段的顶级键，会搜索对象中的所有叶子值：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST bug_reports/_search
{
  "query": {
    "term": {"labels": "urgent"}
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/630.console"></div>
<p>要查询<code class="literal">flattened</code>对象中的特定键，可以使用对象点标记法：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST bug_reports/_search
{
  "query": {
    "term": {"labels.release": "v1.3.0"}
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/631.console"></div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="supported-operations"></a>支持的操作
</h3>
</div></div></div>
<p>由于值的索引方式相似，<code class="literal">flattened</code>字段与<a class="xref" href="keyword.html" title="keyword 数据类型" rel="nofollow"><code class="literal">keyword</code></a>字段共享许多相同的映射和搜索功能。</p>
<p>目前，flattened 对象类型的字段可用于以下查询类型：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">term</code>、<code class="literal">terms</code>和<code class="literal">terms_set</code>
</li>
<li class="listitem">
<code class="literal">prefix</code>
</li>
<li class="listitem">
<code class="literal">range</code>
</li>
<li class="listitem">
<code class="literal">match</code>和<code class="literal">multi_match</code>
</li>
<li class="listitem">
<code class="literal">query_string</code>和<code class="literal">simple_query_string</code>
</li>
<li class="listitem">
<code class="literal">exists</code>
</li>
</ul>
</div>
<p>
查询时，不能使用通配符引用字段的键，如在 <code class="literal">{ "term": {"labels.time*": 1541457010}}</code>中。

请注意，包括<code class="literal">range</code>在内的所有查询都将这些值视为字符串 keyword 类型。

<code class="literal">flattened</code>字段不支持高亮。
</p>
<p>
可以对 flattened 对象字段进行排序，也可以执行简单的 keyword 式聚合，如<code class="literal">terms</code>。

与查询一样，没有对数值的特殊支持 - JSON对象中的所有值都被视为 keyword 类型。

这意味着排序时会按字典顺序进行值的比较。
</p>
<p>
当前无法存储 flattened 对象字段。

不能在映射中指定参数<a class="xref" href="mapping-store.html" title="store" rel="nofollow"><code class="literal">store</code></a>。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="flattened-params"></a>flattened 对象字段的参数
</h3>
</div></div></div>
<p>支持以下几个映射参数：</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<a class="xref" href="mapping-boost.html" title="boost"><code class="literal">boost</code></a>
</p>
</td>
<td valign="top">
<p>
映射字段级查询时的提升。接受浮点数，默认值为<code class="literal">1.0</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">depth_limit</code>
</p>
</td>
<td valign="top">
<p>
就嵌套内部对象而言，flattened 对象字段的最大允许深度。

如果 flattened 对象字段超过此限制，则会抛出错误。

默认值为 <code class="literal">20</code>。

注意，<code class="literal">depth_limit</code>可以通过<a class="xref" href="indices-put-mapping.html" title="映射设置 API" rel="nofollow">映射设置</a> API 动态更新。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="doc-values.html" title="doc_values"><code class="literal">doc_values</code></a>
</p>
</td>
<td valign="top">
<p>
该字段是否应该以列跨度(column-stride)的方式存储在磁盘上，以便以后用于排序、聚合或编写脚本？接受<code class="literal">true</code> (默认) 和 <code class="literal">false</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="eager-global-ordinals.html" title="eager_global_ordinals"><code class="literal">eager_global_ordinals</code></a>
</p>
</td>
<td valign="top">
<p>
是否应该在刷新时加载全局序号?

接受<code class="literal">true</code>和<code class="literal">false</code>(默认)。

对于常用于 terms 聚合的字段，启用此功能是个好主意。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="ignore-above.html" title="ignore_above"><code class="literal">ignore_above</code></a>
</p>
</td>
<td valign="top">
<p>
超过此限制的叶子值将不会被索引。

默认情况下，没有限制，所有值都将被索引。

请注意，此限制适用于 flattened 对象字段内的叶子值，而不是整个字段的长度。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="mapping-index.html" title="index"><code class="literal">index</code></a>
</p>
</td>
<td valign="top">
<p>
确定字段是否应可搜索。接受<code class="literal">true</code> (默认) 和 <code class="literal">false</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="index-options.html" title="index_options"><code class="literal">index_options</code></a>
</p>
</td>
<td valign="top">
<p>
出于评分目的，应该在索引中存储什么信息。

默认为<code class="literal">docs</code>，但也可以设置为<code class="literal">freqs</code>，以便在计算分数时考虑词项的频率。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="null-value.html" title="null_value"><code class="literal">null_value</code></a>
</p>
</td>
<td valign="top">
<p>
替换 flattened 对象字段中任何显式<code class="literal">null</code>值的字符串值。

默认为<code class="literal">null</code>，这意味着 null 字段被视为缺失。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<a class="xref" href="similarity.html" title="similarity"><code class="literal">similarity</code></a>
</p>
</td>
<td valign="top">
<p>
应该使用哪种评分或<em>相似度</em>算法。默认为<code class="literal">BM25</code>。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">split_queries_on_whitespace</code>
</p>
</td>
<td valign="top">
<p>
为该字段构建查询时，<a class="xref" href="full-text-queries.html" title="全文查询">全文查询</a>是否应该使用"空白"拆分输入。

接受<code class="literal">true</code>和<code class="literal">false</code> (默认)。
</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="histogram.html">« histogram(直方图)数据类型</a>
</span>
<span class="next">
<a href="geo-point.html">geo_point(地理坐标点)数据类型 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>